import cv2
import numpy as np

#灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#二值化
#_：一个占位符，表示我们不需要这个返回值。
#gray：输入的灰度图像。
#200：阈值，大于阈值的像素值被设为255，小于阈值的像素值被设为0。
#255：最大值，用于设定二值化后的像素值。    
#cv2.THRESH_BINARY_INV：二值化类型，这里是反向二值化，大于阈值的像素值被设为0，小于阈值的像素值被设为255。
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)

#定义操作核
#np.ones((5, 5), np.uint8)是一个函数，返回的是一个二维数组，其中每个元素都是一个二维数组，代表一个操作核。
#创建一个5x5的全1矩阵，数据类型为np.uint8，即无符号8位整数。
kernal = np.ones((5, 5), np.uint8)
erosion = cv2.erode(binary, kernal, iterations=1)#腐蚀
dilation = cv2.dilate(binary, kernal, iterations=1)#膨胀
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernal)#开运算
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernal)#闭运算
gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernal)#梯度运算
tophat = cv2.morphologyEx(binary, cv2.MORPH_TOPHAT, kernal)#顶帽运算
blackhat = cv2.morphologyEx(binary, cv2.MORPH_BLACKHAT, kernal)#黑帽运算

#显示图像
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.imshow("opening", opening)
cv2.imshow("closing", closing)
cv2.imshow("gradient", gradient)
cv2.imshow("tophat", tophat)
cv2.imshow("blackhat", blackhat)
cv2.waitKey()
cv2.destroyAllWindows()